//@author wtfumlomglol
package amm.Graphic;

import java.io.*;
import java.util.*;

public class Road extends Field {

    //uton lehet stoptabla (ezt a keresztezodes nem orokli)
    private boolean stopSign = false;
    //utnak tobb szomszedja lehet (pontosan ketto)
    protected ArrayList<Neighbour> neighbours = new ArrayList<Neighbour>();

    public Road() {
    }

    //az indexre a névhez van szükség
    public Road(int index) {
        this.name = "Road[" + index + "]";
    }

    //felvesz egy új szomszédot
    @Override
    public void setNeighbour(Field f, Compass c, Direction d) {
        Neighbour n = new Neighbour(f);
        n.setCompass(c);
        n.setDirection(d);
        neighbours.add(n);
    }

    //visszadja az út típusát
    @Override
    public Place getPlace() {
        return Place.ROAD;
    }

    //igaz, ha van rajt stoptábla
    public boolean getSign() {
        return stopSign;
    }

    //beállítja a stoptábla értékét
    public void setSign(boolean s) {
        stopSign = s;
    }

    //visszaadja az út nevét
    public String getName() {
        return name;
    }

    //adott szomszédot ad vissza
    public Neighbour getNeighbour(int i) {
        if (i == 0 || i == 1) {
            return neighbours.get(i);
        } else {
            return null;
        }
    }

    //ez a metodus hivodik meg az ut elhagyasakor
    @Override
    public void leave(boolean forward, Compass c) {
        Field next = null;
        //ha menetiranynak megfeleloen hagyjak el
        if (forward) {
            //ha civil hivja meg
            if (c == null) {
                for (Neighbour n : neighbours) {
                    if (n.getDirection() == Direction.FORWARD) {
                        next = n.getNextRoute(occupiedBy);
                        break;
                    }
                }
            } //ha bankrablo hivja meg
            else {
                for (Neighbour n : neighbours) {
                    if (n.getCompass() == c) {
                        next = n.getNextRouteC(occupiedBy);
                        break;
                    }
                }
            }
        } 
        //ha bankrablo hivja meg
        else {
            for (Neighbour n : neighbours) {
                if (n.getCompass() == c) {
                    next = n.getNextRouteC(occupiedBy);
                    break;
                }
            }
        }

        //ha ervenyes szomszedot talaltunk
        if (next != null) {
            //elmenti a jarmu referenciajat, hogy a clear() utan is kiirhassa
            //a moveTo() visszatereset
            Vehicle veh = occupiedBy;
            occupiedBy.moveTo(next);
        } //ha nem talaltunk ervenyes szomszedot, a jarmunek azt uzeni, maradjon
        else {
            occupiedBy.moveTo(this);
        }
    }

    //ha egy rendor vizsgalodni akar, ertesiti a szomszedait
    @Override
    public void bustCriminal() {
        for (Neighbour n : neighbours) {
            n.investigate();
        }
    }

    //visszaadja a térképhez a jelét
    @Override
    public String getMark() {
        if (occupiedBy != null) {
            return occupiedBy.getMark();
        }
        if (powerUp == PowerUp.EASTERBUNNY) {
            return "Y";
        }
        if (stopSign) {
            return "s";
        } else {
            return sign;
        }
    }
}
